package cn.cuilan.common.core;

import cn.cuilan.common.pipeline.ProtocolChannelInitializer;
import io.netty.bootstrap.AbstractBootstrap;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.Channel;

/**
 * 可配置连接器接口.
 *
 * @param <C> 连接器配置类
 * @param <B> Bootstrap启动类
 * @author zhang.yan
 */
public interface ConnectorConfigurer<
        C extends ConnectorConfiguration,
        B extends AbstractBootstrap<B, ? extends Channel>> {

    /**
     * Bootstrap启动配置.
     * <p>
     * 此方法应在 {@link AbstractProtocolConnector#init()} 方法初始化时调用.
     * </p>
     *
     * <p>配置此实现不执行任何操作</p>
     *
     * @param bootstrap     AbstractBootstrap to configure
     * @param configuration 连接器配置 {@link ConnectorConfiguration}
     */
    default void configureBootstrap(B bootstrap, C configuration) {
    }

    /**
     * Pipeline启动配置.
     * <p>
     * 此方法应在 {@link ProtocolChannelInitializer#initChannel(Channel)} 方法初始化时调用.
     * </p>
     *
     * <p>配置此实现不执行任何操作</p>
     *
     * @param pipeline      ChannelPipeline配置 {@link ChannelPipeline}
     * @param configuration 连接器配置 {@link ConnectorConfiguration}
     */
    default void configurePipeline(ChannelPipeline pipeline, C configuration) {
    }

}
